/* -*-jde-*- */
package ui.administradorInterfaz;

import java.sql.SQLException;
import ui.empresaInterfaz.EmpresaBean;
import ui.empresaInterfaz.VacanteBean;
import app.administrador.Administrador;
import app.util.appException;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import app.conexion.Conexion;
import app.conexion.ConexionException;
import app.htmlGenerator.HTMLVacanteGenerator;
import app.usuario.Usuario;
import app.util.appException;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import ui.alumnoInterfaz.AlumnoBean;

/**
 *
 *
 * @author Victor Miguel Peralta Santa Anna
 * @since Enero 2012
 * @version 0.1
 */
@ManagedBean(name = "administradorActionListener")
@SessionScoped
public class AdministradorActionListener extends AdministradorBean {

    /**
     * Creates a new instance of AdministradorActionListener Aquí hay que
     * incrustar el código para llenar los catalogos prudentes
     */
    public AdministradorActionListener() {
    }

    /**
     * Permite al administrador aceptar una empresa inactiva.
     *
     * @return
     * @throws appException
     */
    public String aceptarEmpresa() throws appException {
        System.out.println(getEmpresaSeleccionada());
        Administrador.aceptaEmpresa(Integer.valueOf(getEmpresaSeleccionada().getIdEmpresa()));
        //Administrador.aceptaVacante(Integer.valueOf(getVacanteSeleccionada().getId()));
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Se aceptó la empresa: ",
                "" + getEmpresaSeleccionada().getNombre()));
        return "";
    }

    public String borrarVacantesConMeses() throws appException {
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Se intentarán borrar todas las vacantes antiguas.",
                "En proceso. ..."));
        String meses = getMeses() != null ? getMeses() : "3";
        Administrador.borraVacantesPorMes(Integer.valueOf(meses));

        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Se borraron todas las vacantes antiguas.",
                ""));

        return "";
    }

    public String borrarAdministrador() throws appException {
        Administrador.borrarAdministrador(getNombreUsuario(), getContrasenia(), getContraseniaSistema());
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                "Se borró un administrador: ",
                "" + getEmpresaSeleccionada().getNombre()));
        return "";
    }

    public String llenarListaVacantesAntiguas() {
        try {
            //Conexion con = new Conexion();
            int meses = 3;

            try {
                meses = !getMeses().equals("") ? Integer.valueOf(getMeses()) : 3;
            } catch (NumberFormatException ex) {
                Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            Conexion con = new Conexion();
            LinkedList<Integer> idVacantesAntiguas = new LinkedList<Integer>();
            String query = "select nidvacante from vacantes where datediff('month', dfechapublicacion, now()::date ) >= " + meses + ";";

            ResultSet r = con.exec(query);

            while (r.next()) {
                int llave = r.getInt("nidvacante");
                idVacantesAntiguas.add(llave);
            }

            getVacantesAntiguas().clear();
            for (int i : idVacantesAntiguas) {
                app.empresa.Vacante vacBD = new app.empresa.Vacante(i);
                VacanteBean tmp = new VacanteBean();

                HTMLVacanteGenerator htmlvg = new HTMLVacanteGenerator(vacBD);
                String display = htmlvg.generarVacante();

                vacBD.setHtmlVacante(display);

                tmp.setId(String.valueOf(vacBD.getnIdVacante()));
                tmp.setTitulo(vacBD.getsTituloVacante());
                tmp.setDescripcion(vacBD.getsDescripcion());
                tmp.setHtmlDescripcion(vacBD.getHtmlVacante());
                tmp.setLatitud(vacBD.getLatitud());
                tmp.setLongitud(vacBD.getLongitud());

                getVacantesAntiguas().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));
            //con.close();
            return "";
        } catch (SQLException ex) {
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        } catch (ConexionException ex) {
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        } catch (appException ex) {
            Logger.getLogger(Administrador.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String rechazarEmpresaActiva() throws appException {

        Administrador.rechazoEmpresaActiva(Integer.valueOf(getEmpresaSeleccionada().getIdEmpresa()));
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                "Se rechazó la empresa: ",
                "" + getEmpresaSeleccionada().getNombre()));
        return "";
    }

    public String rechazarEmpresa() throws appException {
        String motivo = getMotivo() != null ? getMotivo() : "Ponerse en contacto con el administrador para más información.";
        Administrador.rechazoEmpresa(Integer.valueOf(getEmpresaSeleccionada().getIdEmpresa()), motivo);
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                "Se rechazó la empresa: ",
                "" + getEmpresaSeleccionada().getNombre()));
        return "";
    }

    /**
     * Permite al administrador aceptar una empresa inactiva.
     *
     * @return
     * @throws appException
     */
    public String aceptarVacante() throws appException {

        Administrador.aceptaVacante(Integer.valueOf(getVacanteSeleccionada().getId()));
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_INFO,
                "Se aceptó la vacante: ",
                "" + getVacanteSeleccionada().getTitulo()));
        return "";
    }

    /**
     * Permite al administrador rechazar una vacante inactiva
     *
     * @return
     * @throws appException
     */
    public String rechazarVacante() throws appException {

        String motivo = getMotivo() != null ? getMotivo() : "Ponerse en contacto con el administrador para más información.";
        Administrador.rechazoVacante(Integer.valueOf(getVacanteSeleccionada().getId()), motivo);
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                "Se rechazó la vacante: ",
                "" + getVacanteSeleccionada().getTitulo()));
        return "";
    }

    /**
     * Permite al administrador rechazar un alumno por diversos motivos
     *
     * @return
     * @throws appException
     */
    public String rechazarAlumno() throws appException {

        Administrador.rechazoAlumno(Integer.valueOf(getAlumnoSeleccionado().getAlumnoId()));
        FacesContext.getCurrentInstance().addMessage(null,
                new FacesMessage(FacesMessage.SEVERITY_WARN,
                "Se limpió el registro del alumno: ",
                "" + getAlumnoSeleccionado().getNumeroCta()));
        return "";
    }

    public String llenarListaEmpresasInactivas() {
        try {
            //Conexion con = new Conexion();
            LinkedList<app.empresa.Empresa> empresasDB = Administrador.getEmpresasInactivas();
            getEmpresasInactivas().clear();


            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            for (app.empresa.Empresa empresadb : empresasDB) {
                EmpresaBean tmp = new EmpresaBean();
                tmp.setIdEmpresa(String.valueOf(empresadb.getnIdUsuario()));
                tmp.setNombre(empresadb.getsNombre());
                tmp.setDescripcion(empresadb.getsDescripcion());
                tmp.setHtmlDescripcion(empresadb.getHtml());
                getEmpresasInactivas().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));
            //con.close();
            return "";
        } catch (appException ex) {
            Logger.getLogger(AdministradorBean.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String llenarListaEmpresasActivas() {
        try {
            //Conexion con = new Conexion();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            LinkedList<app.empresa.Empresa> empresasDB = Administrador.getEmpresasActivas();
            getEmpresasActivas().clear();

            for (app.empresa.Empresa empresadb : empresasDB) {
                EmpresaBean tmp = new EmpresaBean();
                tmp.setIdEmpresa(String.valueOf(empresadb.getnIdUsuario()));
                tmp.setNombre(empresadb.getsNombre());
                tmp.setDescripcion(empresadb.getsDescripcion());
                tmp.setHtmlDescripcion(empresadb.getHtml());
                getEmpresasActivas().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));

            //con.close();
            return "";
        } catch (appException ex) {
            Logger.getLogger(AdministradorBean.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String llenarListaVacantesInactivas() {
        try {
            //Conexion con = new Conexion();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            LinkedList<app.empresa.Vacante> vacantesBD = Administrador.getVacantesInactivas();
            getVacantesInactivas().clear();
            for (app.empresa.Vacante vacBD : vacantesBD) {
                VacanteBean tmp = new VacanteBean();
                tmp.setId(String.valueOf(vacBD.getnIdVacante()));
                tmp.setTitulo(vacBD.getsTituloVacante());
                tmp.setDescripcion(vacBD.getsDescripcion());
                tmp.setHtmlDescripcion(vacBD.getHtmlVacante());
                tmp.setLatitud(vacBD.getLatitud());
                tmp.setLongitud(vacBD.getLongitud());
                getVacantesInactivas().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));
            //con.close();
            return "";
        } catch (appException ex) {
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String llenarListaVacantesActivas() {
        try {
            //Conexion con = new Conexion();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            LinkedList<app.empresa.Vacante> vacantesBD = Administrador.getVacantesActivas();
            getVacantesActivas().clear();
            for (app.empresa.Vacante vacBD : vacantesBD) {
                VacanteBean tmp = new VacanteBean();
                tmp.setId(String.valueOf(vacBD.getnIdVacante()));
                tmp.setTitulo(vacBD.getsTituloVacante());
                tmp.setDescripcion(vacBD.getsDescripcion());
                tmp.setHtmlDescripcion(vacBD.getHtmlVacante());
                tmp.setLatitud(vacBD.getLatitud());
                tmp.setLongitud(vacBD.getLongitud());
                getVacantesActivas().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));
            //con.close();
            return "";
        } catch (appException ex) {
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String llenarListaAlumnos() {
        try {
            //Conexion con = new Conexion();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "En proceso de recuperar la lista.",
                    "Cargando de la base de datos."));

            LinkedList<app.alumnoe.AlumnoE> alumnosDB = Administrador.getAlumnos();
            getAlumnosTodos().clear();
            for (app.alumnoe.AlumnoE alumnoDB : alumnosDB) {
                AlumnoBean tmp = new AlumnoBean();
                tmp.setAlumnoId(Integer.valueOf(alumnoDB.getnIdUsuario()));
                tmp.setNombre(alumnoDB.getsNombre());
                tmp.setApPat(alumnoDB.getsApellidoPaterno());
                tmp.setApMat(alumnoDB.getsApellidoMaterno());
                tmp.setNumeroCta(alumnoDB.getsNumeroCuenta());
                tmp.setHtmlElegido(alumnoDB.getHtmls());
                getAlumnosTodos().add(tmp);
            }

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Lista Actualizada.",
                    ""));
            //con.close();
            return "";
        } catch (appException ex) {
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }
    }

    public String darDeAltaNuevoAdministrador() {

        try {
            //Conexion con = new Conexion();


            Usuario u = new Usuario(-1, getNombreUsuario(), getContrasenia(), true, "M");
            u.save();

            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_INFO,
                    "Se dió de alta el nuevo administrador.",
                    "Usuario: " + getNombreUsuario() + "    Contraseña: " + getContrasenia()));
            //con.close();
            return "";
        } catch (appException ex) {
            FacesContext.getCurrentInstance().addMessage(null,
                    new FacesMessage(FacesMessage.SEVERITY_ERROR,
                    "No se pudo dar de alta el administrador.",
                    "Intente con otro nombre de usuario o contacte al administrador del sistema."));
            Logger.getLogger(AdministradorActionListener.class.getName()).log(Level.SEVERE, null, ex);
            return "";
        }

    }
}
